/**
 *
 * Created by 35894 on 2017/8/31.
 *
 * 自定义指令，用于对期号的远程验证.主要通过调用ngModel.FormController.$setValidity来改变错误列表.
 * 关于自定义表单验证的指令,详见 https://docs.angularjs.org/api/ng/type/form.FormController
 */
define([
    "app"
], function (app) {
    app.directive("termIdValidate", ["$http", "$timeout", function ($http, $timeout) {
        return {
            restrict: "A",
            require: "ngModel",
            link: function (scope, el, attrs, ctrl) {

                var timeout;

                scope.$watch(attrs.ngModel, function (newValue, oldValue) {

                    // 未编辑过且值为空,不验证
                    if (ctrl.$pristine && !newValue) {
                        return;
                    }

                    // 错误信息:期号已存在,设置该错误信息不显示
                    ctrl.$setValidity("exists", true);
                    // 错误信息:验证中,设置该错误信息显示
                    ctrl.$setValidity("validating", false);
                    // 错误信息:网络异常,设置该错误信息不显示
                    ctrl.$setValidity("network",true);

                    if (timeout) {
                        $timeout.cancel(timeout);
                    }

                    if(!newValue) {
                        ctrl.$setValidity("validating", true);
                        return;
                    }

                    timeout = $timeout(function () {
                        $http({
                            method: "GET",
                            url: requestRootUrl + "api/backend-index/validate-term-id",
                            params: {
                                termId: ctrl.$modelValue // 获取到FormController绑定的model
                            }
                        }).then(
                            function success(resp) {
                                // 根据返回的结果设置期号存在的错误信息
                                ctrl.$setValidity("exists", !resp.data.exists);
                                // 验证结束
                                ctrl.$setValidity("validating", true);
                            },
                            function error(resp) {
                                // 显示错误信息:网络异常
                                ctrl.$setValidity("network",false);
                                ctrl.$setValidity("validating",true);
                                ctrl.$setValidity("exists",true);
                            });
                    }, 500);

                });

            }
        }
    }]);
});